package cn.htu.edu.service.impl;
import cn.htu.edu.entity.Person;
import cn.htu.edu.mapper.PersonMapper;
import cn.htu.edu.service.IPersonService;
import cn.htu.edu.utils.StringUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.SyncReadListener;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author dakai
 * @since 2024-05-10
 */
@Service
public class PersonServiceImpl extends ServiceImpl<PersonMapper, Person> implements IPersonService {

    @Resource
    private PersonMapper personMapper;

    @Override
    public void delete(List<String> ids) {
        personMapper.delete(ids);
    }

    @Override
    public void importExcel(MultipartFile excelFile) throws IOException {
        if (excelFile != null) {
            //将文件存储到当前机器的某个目录
            String baseDir = "D:\\ideaProject\\ipage-two-table\\excel";

            //获取上传的文件的文件名 (ordersetting_template.xlsx)
            String originalFilename = excelFile.getOriginalFilename();
            String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
            //生成一个唯一文件名
            String uniqueFilename = StringUtil.createUUID().replaceAll("-", "") + suffix;

            String dirPath = baseDir ;
            //确保存放文件的目录是存在的
            File dirFile = new File(dirPath);
            if (!dirFile.exists()){
                dirFile.mkdirs();
            }

            //最终存放文件的文件路径
            String filePath = dirPath + "/" + uniqueFilename;

            //保存文件
            excelFile.transferTo(new File(filePath));

            //读取上传后的文件中的内容，将数据添加/更新到ordersetting表中
            /*
                参数一File file： 要读取的目标文件
                参数二Class head ：将目标文件中的行记录封装到java的那个类型对象
                参数三ReadListener readListener ：读取过程中的回调对象(每读取一行，封装成一个对象后，都会触发这个对象的invoke方法)
             */
            List<Person> personList = new ArrayList<>();
            EasyExcel.read(new File(filePath),Person.class,new SyncReadListener(){
                @Override
                public void invoke(Object object, AnalysisContext context) {
                    personList.add((Person) object);
                }
            }).doReadAll();
            //更新或者添加
            for (Person orderSetting : personList) {
                this.save(orderSetting);
            }
        }
    }
}
